﻿using SecsaMvcApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace SecsaMvcApplication.Controllers
{
    public class AccountController : Controller
    {
        private DataContext db = new DataContext();

        //
        // GET: /Account/

        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(LoginViewModel loginViewModel)
        {
            var medico = GetMedico(loginViewModel.NomeUsuario);
            var atAmbulatorio = new AtendenteAmbulatorio();
            var atEmergencia = new AtendenteEmergencia();

            if (medico != null)
                if (!medico.Bloqueado)
                    if (medico.Senha == loginViewModel.Senha)
                        return LoginAndRedirectToIndex(medico);
                    else
                    {
                        atAmbulatorio = GetAtendenteAmbulatorio(loginViewModel.NomeUsuario);
                        LogInFail(medico);
                    }
                else
                    ViewBag.ErrorMessage = "Sua conta está bloqueada! Contate o Administrador.";
            else if (atAmbulatorio != null)
                if (!atAmbulatorio.Bloqueado)
                    if (atAmbulatorio.Senha == loginViewModel.Senha)
                        return LoginAndRedirectToIndex(atAmbulatorio);
                    else
                    {
                        atEmergencia = GetAtendenteEmergencia(loginViewModel.NomeUsuario);
                        LogInFail(atAmbulatorio);
                    }
                else
                    ViewBag.ErrorMessage = "Sua conta está bloqueada! Contate o Administrador.";
            else if (atEmergencia != null)
                if (!atEmergencia.Bloqueado)
                    if (atEmergencia.Senha == loginViewModel.Senha)
                        return LoginAndRedirectToIndex(atEmergencia);
                    else
                        LogInFail(atEmergencia);
                else
                    ViewBag.ErrorMessage = "Sua conta está bloqueada! Contate o Administrador.";
            else
                ViewBag.ErrorMessage = "Conta não encontrada.";

            return View();
        }

        [NonAction]
        private void LogInFail(Usuario usuario)
        {
            RegitrarFalhaLogIn(usuario);
            ViewBag.ErrorMessage = "Log In falhou. Caso falhe 4 vezes consecutivas, sua conta será bloqueada!";
        }

        [NonAction]
        private ActionResult LoginAndRedirectToIndex(Usuario usuario)
        {
            LogIn(usuario);
            return RedirectToRoute(GetIndexRoute());
        }

        [NonAction]
        private void RegitrarFalhaLogIn(Usuario usuario)
        {
            usuario.DataUltimaFalhaLogin = DateTime.Now;
            usuario.FalhasLogin += 1;
            if (usuario.FalhasLogin > 3)
            {
                usuario.Bloqueado = true;
            }
            db.SaveChanges();
        }

        [NonAction]
        private void LogIn(Usuario usuario)
        {
            usuario.DataUltimoLogin = DateTime.Now;
            usuario.FalhasLogin = 0;
            db.SaveChanges();
            System.Web.HttpContext.Current.Session["LoggedIn"] = usuario;
        }

        [NonAction]
        private RouteValueDictionary GetIndexRoute()
        {
            RouteValueDictionary route = new RouteValueDictionary();
            route.Add("Action", "Index");
            route.Add("Controller", "Home");
            return route;
        }

        [NonAction]
        private Medico GetMedico(string nomeUsuario)
        {
            return db.Medicos.
                Where(m => m.NomeUsuario == nomeUsuario).
                FirstOrDefault();
        }

        [NonAction]
        private AtendenteAmbulatorio GetAtendenteAmbulatorio(string nomeUsuario)
        {
            return db.AtendentesAmbulatorio.
                Where(m => m.NomeUsuario == nomeUsuario).
                FirstOrDefault();
        }

        [NonAction]
        private AtendenteEmergencia GetAtendenteEmergencia(string nomeUsuario)
        {
            return db.AtendentesEmergencia.
                Where(m => m.NomeUsuario == nomeUsuario).
                FirstOrDefault();
        }
    }
}
